﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace DynamicDnsChanger.Extensions
{
    /// <summary>
    /// Definição básica de plugin
    /// </summary>
    public interface IPlugin
    {
        /// <summary>
        /// O Nome do plugin
        /// </summary>
        string Name { get; }
    }
    public interface IUpdater : IPlugin
    {
        /// <summary>
        /// Indica mudança no status da atualização
        /// </summary>
        event EventHandler<InfoStatus> StatusChange;
         void Update(String NewIP);
    }
    /// <summary>
    /// Responsável por consultar o endereço IP externo
    /// </summary>
    public interface ICheckIP : IPlugin
    {
        /// <summary>
        /// Indica mudança no status da atualização
        /// </summary>
        event EventHandler<InfoStatus> StatusChange;
        void Check();
    }
    /// <summary>
    /// Responsável por solicitações http
    /// </summary>
    public interface IRequester: IPlugin
    {
        /// <summary>
        /// Indica mudança no status da atualização
        /// </summary>
        event EventHandler<InfoStatus> StatusChange;
        
        string GetString(string requestUri);

        /// <summary>
        /// Envia os dados usando POST
        /// </summary>
        /// <param name="requestUri">O endereço para onde será enviados os dados</param>
        /// <param name="content">Os dados a serem enviados</param>
        /// <returns></returns>
        string PostAsync(string requestUri, IDictionary<String,String> content);
    }
    public enum TypeOfMessage
    {
        Error = 1,
        Success = 2,
        Info = 3
    }
    public class InfoStatus : EventArgs
    {
        public InfoStatus(TypeOfMessage TypeOfMessage,String Message)
        {
            this.Message = Message;
            this.TypeOfMessage = TypeOfMessage;
        }
        public TypeOfMessage TypeOfMessage { get; internal set; }
        public String Message { get; internal set; }
    }

}
